home *** CD-ROM | disk | FTP | other *** search
- IDT 'FFT4-3'
- *
- * Cooley-Tukey Radix-4, DIF FFT Program
- *
- * Three radix-4 butterflies.
- * Complex input data - size limited only by program memory availability.
- * Uses table lookup of twiddle factors.
- * No scaling is done on intermediate values in the program.
- * External data RAM is addressed via peripheral I/O instructions.
- * An address counter is required and is loaded by a write
- * to port 0. Data is read from and written to port 1.
- * Data in the external RAM assumes complex data with corresponding
- * real and imaginary data values in consecutive locations.
- *
- * N is the size of the transform (N = 4**M).
- N EQU 64
- M EQU 3
- *
- * Data memory allocation.
- *
- XI EQU 0 * Data values for butterfly
- YI EQU 1
- XI1 EQU 2
- YI1 EQU 3
- XI2 EQU 4
- YI2 EQU 5
- XI3 EQU 6
- YI3 EQU 7
- I EQU 8 * Data indices
- I1 EQU 9
- I2 EQU 10
- I3 EQU 11
- CO1 EQU 12 * Twiddle factor coefficients
- CO2 EQU 13
- CO3 EQU 14
- SI1 EQU 15
- SI2 EQU 16
- SI3 EQU 17
- N1 EQU 18 * Increment to I
- N2 EQU 19 * Index separation
- IA EQU 20 * Index to twiddle factors
- IE EQU 21 * Increment to IA
- J EQU 22 * Counters
- K EQU 23
- R1 EQU 24 * Temporaries
- R2 EQU 25
- S1 EQU 26
- S2 EQU 27
- R3 EQU 28
- R4 EQU 29
- S3 EQU 30
- S4 EQU 31
- XJ EQU 32
- YJ EQU 33
- TEMP EQU 34
- T EQU 35
- HOLDN EQU 36 * Contains the value N
- QUARTN EQU 37 * Contains the value N/4
- ONE EQU 38 * Contains the value 1
- TABLE EQU 39 * Location of coefficient table
- JT EQU 40
- C21 EQU 41 * Contains value .707106778
- *
- * Begin program memory section.
- *
- AORG 0
- START LDPK 0
- LACK 1
- SACL IE * Initialize IE = 1
- SACL ONE
- LT ONE
- MPYK SINE
- PAC
- SACL TABLE * Save location of sine table
- SUB ONE
- TBLR C21 * Read coefficient for W = J
- MPYK N
- PAC
- SACL HOLDN
- SACL N2 * Initialize N2 = N
- LAC HOLDN,14
- SACH QUARTN * QUARTN = N/4
- LARK AR1,M-1 * AR0 contains K value
- KLOOP LAC N2
- SACL N1 * N1 = N2
- LAC N2,13
- SACH N2,1 * N2 = N2/4
- SACH JT * JT = N2/2
- ********************************************************************
- *
- * Special butterfly for theta = 0.
- *
- ********************************************************************
- LARP 0
- LAR AR0,IE * Loop counter - repeat loop IE times
- MAR *-
- ZAC
- SACL I * I = 0.
- ZERO LAC I
- ADD N2,1
- SACL I1 * I1 = I + N2
- ADD N2,1
- SACL I2 * I2 = I1 + N2
- ADD N2,1
- SACL I3 * I3 = I2 + N2
- *
- * Read in four data values.
- *
- OUT I,PA0
- IN XI,PA1
- IN YI,PA1
- OUT I1,PA0
- IN XI1,PA1
- IN YI1,PA1
- OUT I2,PA0
- IN XI2,PA1
- IN YI2,PA1
- OUT I3,PA0
- IN XI3,PA1
- IN YI3,PA1
- *
- * Start butterfly.
- *
- LAC XI
- ADD XI2
- SACL R1 * R1 = X(I) + X(I2)
- SUB XI2,1
- SACL R2 * R2 = X(I) - X(I2)
- LAC XI1
- ADD XI3
- SACL R3 * R3 = X(I1) + X(I3)
- ADD R1
- SACL XI * X(I) = R1 + R3
- SUB R3,1
- SACL XI2 * X(I2) = R1 - R3
- *
- LAC YI
- ADD YI2
- SACL R1 * R1 = Y(I) + Y(I2)
- SUB YI2,1
- SACL R4 * R4 = Y(I) - Y(I2)
- LAC YI1
- ADD YI3
- SACL R3 * R3 = Y(I1) + Y(I3)
- ADD R1
- SACL YI * Y(I) = R1 + R3
- SUB R3,1
- SACL YI2 * Y(I2) = R1 - R3
- *
- LAC XI1
- SUB XI3
- SACL R1 * R1 = X(I1) - X(I3)
- LAC YI1
- SUB YI3
- SACL R3 * R3 = Y(I1) - Y(I3)
- ADD R2
- SACL XI1 * X(I1) = R2 + R3
- SUB R3,1
- SACL XI3 * X(I3) = R2 - R3
- LAC R4
- SUB R1
- SACL YI1 * Y(I1) = R4 - R1
- ADD R1,1
- SACL YI3 * Y(I3) = R4 + R1
- *
- * Output four results.
- *
- OUT I,PA0
- OUT XI,PA1
- OUT YI,PA1
- OUT I1,PA0
- OUT XI1,PA1
- OUT YI1,PA1
- OUT I2,PA0
- OUT XI2,PA1
- OUT YI2,PA1
- OUT I3,PA0
- OUT XI3,PA1
- OUT YI3,PA1
- *
- LAC I
- ADD N1,1
- SACL I * I = I + N1
- BANZ ZERO
- *
- * End of W = 0 butterfly.
- *
- LARP 1
- BANZ NORM * If this is last phase,
- B DRC4 * go to end.
- *****************************************************************
- *
- * Standard radix-4 butterfly.
- *
- *****************************************************************
- NORM LAC IE
- SACL IA * IA = IE
- LARP 0
- LAR AR0,N2
- MAR *-
- MAR *- * Loop for J = 1 to N2-1
- LACK 1
- SACL J
- JLOOP SUB JT
- BZ SPEC * If J = JT, then use special butterfly.
- *
- LAC TABLE
- ADD IA
- TBLR SI1 * Get twiddle factor 1
- ADD QUARTN
- TBLR CO1
- LAC TABLE
- ADD IA,1
- TBLR SI2 * Get twiddle factor 2
- ADD QUARTN
- TBLR CO2
- LAC TABLE
- ADD IA,1
- ADD IA
- TBLR SI3 * Get twiddle factor 3
- ADD QUARTN
- TBLR CO3
- LAC IA
- ADD IE
- SACL IA * IA = IA + IE
- LAC J,1
- SACL I * I = J (data organized as real value followed
- * * by imaginary so address I is 2 times J).
- ILOOP LAC I
- ADD N2,1
- SACL I1 * I1 = I + N2
- ADD N2,1
- SACL I2 * I2 = I1 + N2
- ADD N2,1
- SACL I3 * I3 = I2 + N2
- *
- OUT I,PA0 * Output address of XI
- IN XI,PA1 * Read real and imaginary parts
- IN YI,PA1
- OUT I1,PA0 * Output address of XI1
- IN XI1,PA1 * Read real and imaginary parts
- IN YI1,PA1
- OUT I2,PA0 * Output address of XI2
- IN XI2,PA1 * Read real and imaginary parts
- IN YI2,PA1
- OUT I3,PA0 * Output address of XI3
- IN XI3,PA1 * Read real and imaginary parts
- IN YI3,PA1
- *
- * Compute butterfly.
- *
- LAC XI
- ADD XI2
- SACL R1 * R1 = X(I) + X(I2)
- SUB XI2,1
- SACL R2 * R2 = X(I) - X(I2)
- LAC XI1
- ADD XI3
- SACL T * T = X(I1) + X(I3)
- ADD R1
- SACL XI * X(I) = R1 + T
- SUB T,1
- SACL R1 * R1 = R1 - T
- LAC YI
- ADD YI2
- SACL S1 * S1 = Y(I) + Y(I2)
- SUB YI2,1
- SACL S2 * S2 = Y(I) - Y(I2)
- LAC YI1
- ADD YI3
- SACL T * T = Y(I1) + Y(I3)
- ADD S1
- SACL YI * Y(I) = S1 + T
- SUB T,1
- SACL S1 * S1 = S1 -T
- *
- LT CO2
- MPY S1
- PAC
- LT SI2
- MPY R1
- SPAC
- SACH YI2,1 * Y(I2) = (S1*CO2) - (R1*SI2)
- MPY S1
- PAC
- LT CO2
- MPY R1
- LTA CO1
- SACH XI2,1 * X(I2) = (R1*CO2) + (SI*SI2)
- *
- LAC YI1
- SUB YI3
- SACL T * T = Y(I1) - Y(I3)
- ADD R2
- SACL R1 * R1 = R2 + T
- SUB T,1
- SACL R2 * R2 = R2 - T
- LAC XI1
- SUB XI3
- SACL T * T = X(I1) - X(I3)
- LAC S2
- SUB T
- SACL S1 * S1 = S2 - T
- ADD T,1
- SACL S2 * S2 = S2 + T
- ***
- MPY S1
- PAC
- LT SI1
- MPY R1
- SPAC
- SACH YI1,1 * Y(I1) = (S1*CO1) - (R1*SI1)
- MPY S1
- PAC
- LT CO1
- MPY R1
- LTA CO3
- SACH XI1,1 * X(I1) = (R1*CO1) + (S1*SI1)
- MPY S2
- PAC
- LT SI3
- MPY R2
- SPAC
- SACH YI3,1 * Y(I3) = (S2*CO3) - (R2*SI3)
- MPY S2
- PAC
- LT CO3
- MPY R2
- APAC
- SACH XI3,1 * X(I3) = (R2*CO3) + (S2*SI3)
- *
- * Output results of the butterfly.
- *
- OUT I,PA0
- OUT XI,PA1
- OUT YI,PA1
- OUT I1,PA0
- OUT XI1,PA1
- OUT YI1,PA1
- OUT I2,PA0
- OUT XI2,PA1
- OUT YI2,PA1
- OUT I3,PA0
- OUT XI3,PA1
- OUT YI3,PA1
- *
- * Add increment for next loop.
- *
- LAC I
- ADD N1,1
- SACL I * I = I + N1
- SUB HOLDN,1
- BLZ ILOOP * Loop while I < N
- LAC J
- ADD ONE
- SACL J * J = J + 1
- BANZ JLOOP
- LAC IE,2
- SACL IE * IE = IE * 4
- B KLOOP
- ********************************************************************
- *
- * Special routine for theta = pi/4.
- *
- ********************************************************************
- SPEC LAC J,1
- SACL I * I = J
- SLOOP LAC I
- ADD N2,1
- SACL I1 * I1 = I + N2
- ADD N2,1
- SACL I2 * I2 = I1 + N2
- ADD N2,1
- SACL I3 * I3 = I2 +N2
- *
- * Input data values.
- *
- OUT I,PA0
- IN XI,PA1
- IN YI,PA1
- OUT I1,PA0
- IN XI1,PA1
- IN YI1,PA1
- OUT I2,PA0
- IN XI2,PA1
- IN YI2,PA1
- OUT I3,PA0
- IN XI3,PA1
- IN YI3,PA1
- *
- * Compute butterfly.
- *
- LAC XI
- ADD XI2
- SACL R1 * R1 = X(I) + X(I2)
- SUB XI2,1
- SACL R2 * R2 = X(I) - X(I2)
- LAC YI
- ADD YI2
- SACL S1 * S1 = Y(I) + Y(I2)
- SUB YI2,1
- SACL S2 * S2 = Y(I) - Y(I2)
- LAC XI1
- ADD XI3
- * * T = X(I1) + X(I3)
- ADD R1
- SACL XI * X(I) = T + R1
- SUB R1,1
- SACL YI2 * Y(I2) = T - R1
- LAC YI1
- ADD YI3
- SACL T * T = Y(I1) + Y(I3)
- ADD S1
- SACL YI * Y(I) = S1 + T
- SUB T,1
- SACL XI2 * X(I2) = S1 - T
- LAC XI1
- SUB XI3
- SACL R1 * R1 = X(I1) - X(I3)
- LAC YI1
- SUB YI3
- SACL S1 * S1 = Y(I1) - Y(I3)
- ADD R2
- SACL T * T = R2 + S1
- SUB S1,1
- SACL R2 * R2 = R2 - S1
- LAC S2
- SUB R1
- SACL S1 * S1 = S2 - R1
- ADD R1,1
- SACL S2 * S2 = S2 + R1
- *
- LT C21
- MPY S1
- PAC
- MPY T
- APAC
- SACH XI1,1 * X(I1) = (T + S1) * C21
- SPAC
- SPAC
- SACH YI1,1 * Y(I1) = (S1 - T) * C21
- ZAC
- MPY R2
- SPAC
- MPY S2
- APAC
- SACH XI3,1 * X(I3) = (S2 - R2) * C21
- SPAC
- SPAC
- SACH YI3,1 * Y(I3) = -(S2 + R2) * C21
- *
- * Output results.
- *
- OUT I,PA0
- OUT XI,PA1
- OUT YI,PA1
- OUT I1,PA0
- OUT XI1,PA1
- OUT YI1,PA1
- OUT I2,PA0
- OUT XI2,PA1
- OUT YI2,PA1
- OUT I3,PA0
- OUT XI3,PA1
- OUT YI3,PA1
- *
- LAC I
- ADD N1,1
- SACL I * I = I + N1
- SUB HOLDN,1
- BLZ SLOOP * Loop while I < N
- LAC J
- ADD ONE
- SACL J * J = J + 1
- LAC IA
- ADD IE
- SACL IA * IA = IA + IE
- BANZ JLOOP
- LAC IE,2
- SACL IE * IE = IE * 4
- B KLOOP
- *
- * Digit reverse counter for radix-4 FFT computation.
- *
- DRC4 ZAC
- SACL J
- SACL I
- LARP 0
- LAR AR0,HOLDN
- MAR *-
- MAR *-
- DRLOOP SUB J
- BGEZ NOSWAP
- * Swap I and J values.
- OUT I,PA0
- IN XI,PA1
- IN YI,PA1
- OUT J,PA0
- IN XJ,PA1
- IN YJ,PA1
- OUT J,PA0
- OUT XI,PA1
- OUT YI,PA1
- OUT I,PA0
- OUT XJ,PA1
- OUT YJ,PA1
- *
- NOSWAP LAC QUARTN,1
- SACL K
- INLOOP LT K
- MPYK 3
- PAC
- SACL TEMP
- SUB J
- BGZ OUTL
- LAC J
- SUB TEMP
- SACL J
- LAC K,14
- SACH K
- B INLOOP
- OUTL LAC J
- ADD K
- SACL J
- LAC I
- ADD ONE,1
- SACL I
- BANZ DRLOOP
- *
- * End of FFT
- *
- STOP B STOP
- *
- * Twiddle factor for theta = pi/4.
- *
- COS21 DATA 23169
- *
- * Sine and cosine table.
- *
- SINE EQU $
- DATA 0
- DATA 3211
- DATA 6392
- DATA 9511
- DATA 12539
- DATA 15446
- DATA 18204
- DATA 20787
- DATA 23169
- DATA 25329
- DATA 27244
- DATA 28897
- DATA 30272
- DATA 31356
- DATA 32137
- DATA 32609
- COSINE EQU $
- DATA 32767
- DATA 32609
- DATA 32137
- DATA 31356
- DATA 30272
- DATA 28897
- DATA 27244
- DATA 25329
- DATA 23169
- DATA 20787
- DATA 18204
- DATA 15446
- DATA 12539
- DATA 9511
- DATA 6392
- DATA 3211
- DATA 0
- DATA -3211
- DATA -6392
- DATA -9511
- DATA -12539
- DATA -15446
- DATA -18204
- DATA -20787
- DATA -23169
- DATA -25329
- DATA -27244
- DATA -28897
- DATA -30272
- DATA -31356
- DATA -32137
- DATA -32609
- DATA -32767
- DATA -32609
- DATA -32137
- DATA -31356
- DATA -30272
- DATA -28897
- DATA -27244
- DATA -25329
- DATA -23169
- DATA -20787
- DATA -18204
- DATA -15446
- DATA -12539
- DATA -9511
- DATA -6392
- DATA -3211
- END